package com.flyqiu.form.model;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

@EqualsAndHashCode(callSuper = true)
@Data
public class SqlColumnModel extends DefaultSqlColType {

    @Schema(title = "主键")
    protected String id;
    @Schema(title = "label")
    protected String label;
    @Schema(title = "数据表列名")
    protected String prop;

    /**
     * 设置标签值，并去除两端空白字符。
     * 如果传入的标签为空或空白，则不进行任何操作。
     *
     * @param label 标签值
     */
    public void setLabel(String label) {
        if (StringUtils.isBlank(label)) {
            return; // 直接返回
        }
        this.label = label.trim();
    }

    /**
     * 设置数据表列名，并移除换行符。
     * 如果传入的列名为空或空白，则直接设置。
     *
     * @param prop 数据表列名
     */
    public void setProp(String prop) {
        if (StringUtils.isBlank(prop)) {
            this.prop = prop;
            return;
        }
        this.prop = prop.replaceAll("\\s+", ""); // 使用更简洁的正则表达式
    }

    /**
     * 检查当前列与另一个列模型是否相同。
     * 比较的属性包括：实际列名、标签、列名、SQL数据类型、长度及精度。
     *
     * @param sqlColumnModel 另一个列模型
     * @return 是否相同
     */
    public boolean isMatch(SqlColumnModel sqlColumnModel) {
        if (sqlColumnModel == null) {
            return false;
        }

        if (!Objects.equals(getRealProp(this), getRealProp(sqlColumnModel))) {
            return false;
        }
        if (!isMatch(label, sqlColumnModel.getLabel())) {
            return false;
        }
        if (!isMatch(prop, sqlColumnModel.getProp())) {
            return false;
        }
        if (!isMatch(getSqlDataType(), sqlColumnModel.getSqlDataType())) {
            return false;
        }
        if (!isMatch(getSqlDataLength(), sqlColumnModel.getSqlDataLength())) {
            return false;
        }
        return isMatch(getPrecision(), sqlColumnModel.getPrecision());
    }

    /**
     * 获取实际使用的列名。
     * 如果ID存在，则返回ID；否则返回prop。
     *
     * @param model 列模型
     * @return 实际列名
     */
    public static String getRealProp(SqlColumnModel model) {
        if (StringUtils.isNotBlank(model.getId())) {
            return model.getId();
        }
        return model.getProp();
    }

    /**
     * 安全地比较两个字符串是否相等。
     * 能够处理null值。
     *
     * @param mine   当前对象的属性值
     * @param theirs 另一个对象的属性值
     * @return 是否相等
     */
    private boolean isMatch(String mine, String theirs) {
        return Objects.equals(mine, theirs);
    }

    /**
     * 安全地比较两个整数值是否相等。
     * 如果任一值为null，则默认为0。
     *
     * @param mine   当前对象的属性值
     * @param theirs 另一个对象的属性值
     * @return 是否相等
     */
    private boolean isMatch(Integer mine, Integer theirs) {
        mine = safeValue(mine, 0);
        theirs = safeValue(theirs, 0);
        return Objects.equals(mine, theirs);
    }

    /**
     * 统一null值处理。
     *
     * @param value      值
     * @param defaultValue 默认值
     * @param <T>        泛型类型
     * @return 处理后的值
     */
    private static <T> T safeValue(T value, T defaultValue) {
        return (value != null) ? value : defaultValue;
    }
}
